each_len = 50
fudong = 3
en_size = 0.8


def formatter(input, each_l, fu, en_s=None):
    """
    格式化字符串
    :param input:
    :param each_l: 每行长度
    :param fu: 浮动范围
    :return:
    """
    if each_l is None or fu is None:
        each_l = each_len
        fu = fudong
    if en_s is None:
        en_s = en_size
    right = [',', '，', '。', '?', '!']
    result = []
    count = 0
    temp_str = []
    for c in input:
        if c == '\n':
            continue
        temp_str.append(c)
        # 中文+1，其他加0.5
        count += 1 if is_chinese(c) else en_s
        if each_l - fu <= count <= each_l + fu:
            if c in right:
                if len(temp_str) > 0 and temp_str[0] == ' ':
                    temp_str[0] = ''
                result.append(''.join(temp_str))
                count = 0
                temp_str = []
        elif each_l + fu < count:
            count = 0
            flag = False  # 后半段挑选中文换行，或者英文中的空格
            for i in range(len(temp_str) - fu, len(temp_str)):
                if is_chinese(temp_str[i]) or temp_str[i] == ' ':
                    flag = True
                    if len(temp_str) > 0 and temp_str[0] == ' ':
                        temp_str[0] = ''
                    result.append(''.join(temp_str[0:i + 1]))
                    temp_str = temp_str[i + 1:]
                    for ch in temp_str:
                        count += 1 if is_chinese(ch) else en_s
                    break
            if_split_all_the_way = True
            if not flag:  # 挑选前半段倒数第一个汉字或者空格换行
                for i in range(len(temp_str) - fu, len(temp_str) - fu * 2, -1):
                    if is_chinese(temp_str[i]) or temp_str[i] == ' ':
                        if_split_all_the_way = False
                        if len(temp_str) > 0 and temp_str[0] == ' ':
                            temp_str[0] = ''
                        result.append(''.join(temp_str[0:i + 1]))
                        temp_str = temp_str[i + 1:]
                        for ch in temp_str:
                            count += 1 if is_chinese(ch) else en_s
                        break
            if if_split_all_the_way:  # 只能中间换行了
                if len(temp_str) > 0 and temp_str[0] == ' ':
                    temp_str[0] = ''
                result.append(''.join(temp_str[0:-fu]))
                temp_str = temp_str[-fu:]
                for ch in temp_str:
                    count += 1 if is_chinese(ch) else en_s
    result.append(''.join(temp_str))
    res_str = ''
    for ttt in result:
        if ttt == '\n' or ttt == '' or ttt == ' ':
            continue
        res_str += ttt + '\n'
    res_str.rstrip('\n')
    return res_str


def is_chinese(c):
    try:
        c.encode('ascii')
        return False
    except UnicodeEncodeError:
        return True
